/**
 * 边界高亮图层
 */
import sgisSpatial from "../../sgis.spatial.query.js";
import sgisRegionBase from "../../sgis.region.base.js";
export default {
  HLLayer: null, // 高亮图层组
  initHLLayer(map) {
    if (this.HLLayer === null) {
      this.HLLayer = L.featureGroup().addTo(map);
    }
  },
  // 为指定区划添加区划边界（包含两级，当前传过来的指定区划和）
  /**
   * 根据区划添加边界
   * regionInfos 区划信息
   * type 区划类型   type=1  普通区划 3 特色区 2高新区
   */
  addHLBoundary(regionInfos, type, map) {
    let _this = this;
    sgisSpatial.spatialQueryUtil.getFeaturesByRegionCodes(
      regionInfos,
      type,
      function(serviceResult) {
        // 初始化高亮图层
        _this.initHLLayer(map);
        // 清空高亮图层
        _this.clearHLLayer();
        // 添加本层区划边界 color 红色 宽度 3 CLayers
        if (
          serviceResult.result.features &&
          serviceResult.result.features !== null
        ) {
          let PLayers = L.geoJSON(serviceResult.result.features, {
            style: {
              color: "#FF0000", // 设置上级边界为#FF0000  下一级边界为灰色#C0C0C0
              weight: 4, // 上级边界的颜色为3    下一级边界的颜色为灰色
              fill: true, // 此处设置边界多边形填充为true,不然不能点击
              fillOpacity: 0
            }
          });
          PLayers.on("dblclick", function(e) {
            if (e.layer.feature && e.layer.feature !== null) {
              // 增加双击下钻区划的功能  暂时没用到
            }
          });

          // 添加下层区划边界 color 灰色 宽度 1 (此处适合普通区划，特色区划规则不符合)
          let childRegionInfos = [];
          if (
            regionInfos &&
            regionInfos !== null &&
            regionInfos.length > 0
          ) {
            for (let i = 0; i < regionInfos.length; i++) {
              let temp = JSON.parse(JSON.stringify(regionInfos[i]));
              temp.regioncode = sgisRegionBase.regionUtils.caluMacRegion(
                parseInt(temp.regionlevel) + 1 + "",
                temp.regioncode
              ); // 此处区划等级+1，获取下级行政区划的边界
              childRegionInfos.push(temp);
            }
            sgisSpatial.spatialQueryUtil.getFeaturesByRegionCodes(
              childRegionInfos,
              type,
              function(serviceResult) {
                if (!serviceResult) return;
                // 添加本层区划边界 color 红色 宽度 3 CLayers
                let CLayers = L.geoJSON(serviceResult.result.features, {
                  style: {
                    color: "#6F7691", // 设置上级边界为#FF0000  下一级边界为灰色#C0C0C0 #6F7691
                    weight: 1, // 上级边界的颜色为3    下一级边界的颜色为灰色
                    fill: false // 此处设置边界多边形填充为true,不然不能点击
                  }
                });

                _this.HLLayer.addLayer(CLayers).addLayer(PLayers); // 子区划图层在父区划图层之下，最外层产生压盖
              }
            );
          }
          // 移动缩放地图到合适为位置和比例，方便看到选中的所有区划
          let points = [];
          for (let j = 0; j < PLayers.getLayers().length; j++) {
            let layerTemp = PLayers.getLayers()[j];
            let tempLatLng = [];
            tempLatLng.push(layerTemp._bounds._northEast.lat);
            tempLatLng.push(layerTemp._bounds._northEast.lng);
            points.push(tempLatLng);
            tempLatLng = [];
            tempLatLng.push(layerTemp._bounds._southWest.lat);
            tempLatLng.push(layerTemp._bounds._southWest.lng);
            points.push(tempLatLng);
          }
          map.flyToBounds(L.latLngBounds(points));
        }
      }
    );
  },
  // 清空高亮图层
  clearHLLayer() {
    if (this.HLLayer !== null) {
      this.HLLayer.clearLayers();
    }
  },
  /**
   * 通过features直接刷新features
   * 刷新高亮图层的features,先清除后增加
   */
  refreshBoundaryFeatures(features, map) {
    if (!features || features.length < 1) {
      return;
    } // 初始化一下高亮图层
      this.initHLLayer(map);
    // 清除原有features
    this.clearHLLayer();
    // 添加新的features
    let PLayers = L.geoJSON(features, {
      style: {
        color: "#FF0000", // 设置上级边界为#FF0000  下一级边界为灰色#C0C0C0
        weight: 4, // 上级边界的颜色为3    下一级边界的颜色为灰色
        fill: true, // 此处设置边界多边形填充为true,不然不能点击
        fillOpacity: 0
      }
    });
    this.HLLayer.addLayer(PLayers);
    // 地图平滑缩放显示所有boundary
    let points = [];
    for (let j = 0; j < PLayers.getLayers().length; j++) {
      let layerTemp = PLayers.getLayers()[j];
      let tempLatLng = [];
      tempLatLng.push(layerTemp._bounds._northEast.lat);
      tempLatLng.push(layerTemp._bounds._northEast.lng);
      points.push(tempLatLng);
      tempLatLng = [];
      tempLatLng.push(layerTemp._bounds._southWest.lat);
      tempLatLng.push(layerTemp._bounds._southWest.lng);
      points.push(tempLatLng);
    }
    map.flyToBounds(L.latLngBounds(points));
  }
};
